package evemanutool.utils.httpdata;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import evemanutool.data.cache.MarketInfoEntry;
import evemanutool.gui.main.EMT;
import evemanutool.utils.databases.PriceDB;
import evemanutool.utils.datahandling.DatabaseHandler.Stage;
public class EVECentralWorker extends ProgressWorker {
//Constants.
private static final int QUERY_DELAY = 2000;
private static final int MAX_QUERIES = 25;
//DB:s.
private PriceDB pdb;
//GUI
private JLabel status;
//Query info.
private List<Integer> sellTypeIds;
private List<Integer> buyTypeIds;
private List<Integer> commonTypeIds = new ArrayList<>();
private String sellSystem;
private String buySystem;
public EVECentralWorker(List<Integer> sellTypeIds, List<Integer> buyTypeIds, String sellSystem, String buySystem, PriceDB pdb, JProgressBar marketPB, JLabel marketStatus) {
super(marketPB, Math.max(sellTypeIds.size(), buyTypeIds.size()));
this.sellTypeIds = sellTypeIds;
this.buyTypeIds = buyTypeIds;
this.sellSystem = sellSystem;
this.buySystem = buySystem;
this.pdb = pdb;
this.status = marketStatus;
}
@Override
protected Void doInBackground() throws Exception {
super.doInBackground();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
status.setText("Incomplete: Updating");
}
});
//Find common queries. Use the max number of days of the two.
for (Integer id : sellTypeIds) {
if (buyTypeIds.contains(id)) {
commonTypeIds.add(id);
}
}
//Remove the common queries from the single lists.
for (Integer id : commonTypeIds) {
sellTypeIds.remove(id);
buyTypeIds.remove(id);
}
doCommonQueries();
doUniqueQueries();
return null;
}
private void doCommonQueries() throws InterruptedException {
//Temp lists.
ArrayList<Integer> iL = new ArrayList<>();
List<MarketInfoEntry> mL = new ArrayList<>();
while (!Thread.interrupted() && !commonTypeIds.isEmpty()) {
iL = createQuery(commonTypeIds);
//Do query.
mL = EveCentralQuery.getMarketInfo(iL, sellSystem);
pdb.addAllSMI(mL);
if (sellSystem.equals(buySystem)) {
pdb.addAllBMI(mL);
}else {
//Wait before extra query.
Thread.sleep(QUERY_DELAY);
pdb.addAllBMI(EveCentralQuery.getMarketInfo(iL, buySystem));
}
//Publish progress.
publish(commonTypeIds.size() + Math.max(sellTypeIds.size(), buyTypeIds.size()));
//Wait until next query.
Thread.sleep(QUERY_DELAY);
}
}
private void doUniqueQueries() throws InterruptedException {
//Temp lists.
ArrayList<Integer> iL = new ArrayList<>();
List<MarketInfoEntry> mL = new ArrayList<>();
while (!Thread.interrupted() && !sellTypeIds.isEmpty()) {
iL = createQuery(sellTypeIds);
//Do query.
mL = EveCentralQuery.getMarketInfo(iL, sellSystem);
pdb.addAllSMI(mL);
//Publish progress.
publish(commonTypeIds.size() + Math.max(sellTypeIds.size(), buyTypeIds.size()));
//Wait until next query.
Thread.sleep(QUERY_DELAY);
}
while (!Thread.interrupted() && !buyTypeIds.isEmpty()) {
iL = createQuery(buyTypeIds);
//Do query.
mL = EveCentralQuery.getMarketInfo(iL, buySystem);
pdb.addAllBMI(mL);
//Publish progress.
publish(commonTypeIds.size() + Math.max(sellTypeIds.size(), buyTypeIds.size()));
//Wait until next query.
Thread.sleep(QUERY_DELAY);
}
}
/*
* Will remove used id's from the parameter list.
*/
private ArrayList<Integer> createQuery(List<Integer> typeIds) {
ArrayList<Integer> iL = new ArrayList<>();
//Pull some ids to make a query.
while(!typeIds.isEmpty() && iL.size() < MAX_QUERIES){
iL.add(typeIds.get(0));
typeIds.remove(0);
}
return iL;
}
@Override
protected void process(List<Integer> chunks) {
super.process(chunks);
if (pdb.isComplete()) {
status.setText("Expired: Updating");
}
}
@Override
protected void done() {
super.done();
status.setText("Complete: Idle");
//Only update if database already complete to avoid double updating.
if (pdb.isComplete()) {
EMT.D_HANDLER.reportDBUpdateAtStage(pdb, Stage.PROCESS);
}
}
}